package com.spc.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.spc.dao.Menudao;
import com.spc.dao.PermissionDao;
import com.spc.dao.RoleDao;
import com.spc.dao.UserDao;
import com.spc.entity.PageResult;
import com.spc.entity.QueryPageBean;
import com.spc.pojo.*;
import com.spc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 用户服务
 */

@Service(interfaceClass = UserService.class)
//@org.springframework.stereotype.Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;
    @Autowired
    private PermissionDao permissionDao;
    @Autowired
    private Menudao menudao;

    //根据用户名查询用户信息和关联的角色信息，同时需要查询角色关联的权限信息
    @Override
    public User findByUsername(String username) {
        //只查询用户基本信息
        User user = userDao.findByUsername(username);
        if (user == null) {
            return null;
        }
        Integer userId = user.getId();
        //查询用户对应的角色
        Set<Role> roles = roleDao.findByUserId(userId);
        //根据角色查询相关权限
        for (Role role : roles) {
            Integer roleId = role.getId();
            Set<Permission> permissions = permissionDao.findByRoleId(roleId);
            role.setPermissions(permissions);
        }
        user.setRoles(roles);
        return user;
    }

    /**
     * 用户管理-分页查询
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //取出分页条件
        Integer currentPage = queryPageBean.getCurrentPage();//当前页码
        Integer pageSize = queryPageBean.getPageSize();//每页记录数
        String queryString = queryPageBean.getQueryString();//查询条件
        //调用dao完成分页查询，使用mybatis分页助手插件
        PageHelper.startPage(currentPage, pageSize);
        Page<User> page = userDao.findByCondition(queryString);
        //使用分页助手中的方法获取总记录数和分页数据
        long total = page.getTotal();
        List<User> rows = page.getResult();
        PageResult pageResult = new PageResult(total, rows);
        return pageResult;
    }

    /**
     * 根据id查询用户信息,用于数据回显
     *
     * @param id
     * @return
     */
    @Override
    public User findById(Integer id) {
        User user = userDao.findById(id);
        return user;
    }

    @Override
    public void add(User user) {
        userDao.add(user);
    }

    @Override
    public void edit(User user) {
        userDao.edit(user);
    }

    @Override
    public void deleteById(Integer id) {
        //根据用户id查询是否拥有角色
        Integer[] count = roleDao.findUserRoles(id);
        if (count.length == 0 || count == null) {
            //如果没有角色,那么中间表不存在数据,则可以删除
        }
        //如果有数据,先删中间表,再删用户表
        roleDao.deleteUserRoles(id);
        userDao.deleteById(id);
    }

    @Override
    public List<Role> findRoles() {
        List<Role> list = roleDao.findRoles();
        return list;
    }

    @Override
    public Integer[] findUserRoles(Integer id) {
        Integer[] integers = roleDao.findUserRoles(id);
        return integers;
    }

    @Override
    public void editRoles(Integer userId, Integer[] roleIds) {
        Map<String, Object> map = map = new HashMap<>();
        if (roleIds.length > 0 && roleIds != null) {
            map.put("roleIds", roleIds);
            map.put("userId", userId);
        }
        //根据用户id查询是否拥有角色
        Integer[] count = roleDao.findUserRoles(userId);
        if (count.length == 0 || count == null) {
            //如果没有角色,那么中间表不存在数据,则需要插入数据,insert语句
            roleDao.addRolesByUid(map);
        }
        //如果当前用户拥有角色,先删除之前拥有的角色,再添加角色
        roleDao.deleteUserRoles(userId);
        roleDao.addRolesByUid(map);
    }

    //查询用户角色对应的菜单权限
    @Override
    public List<Menu> findByname(String username) {
        //查询当前用户的id
        User user = userDao.findByUsername(username);
        //拿到用户id查询关联表拿到所有对应的角色
        Integer[] userRoles = roleDao.findUserRoles(user.getId());
        List<Menu> list = new ArrayList<>();
        for (Integer userRole : userRoles) {
            //根据角色id查询菜单关联表
            Integer[] menus = roleDao.findmenus(userRole);
            //拿到角色对应的所有菜单,查询菜单表
            List<Menu> menufu = menudao.findbyidfu(menus);//查询父菜单
            for (Menu menu : menufu) {
                List<Menu> menuzi = menudao.findByidzi(menu.getId());//查询子菜单
                menu.setChildren(menuzi);
                list.add(menu);
            }
        }
        return list;
    }
}
